﻿#include "maponlinedemo.h"
#include "ui_maponlinedemo.h"
#include <QDebug>
MapOnlineDemo::MapOnlineDemo(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MapOnlineDemo)
{
    ui->setupUi(this);

    /*********添加HTML图层操作******************************************************************/
    //view = new QWebEngineView(ui->widget);
    view = new QWebEngineView(this);
    QStackedLayout* layout = new QStackedLayout(ui->frame);
    ui->frame->setLayout(layout);
    layout->addWidget(view);

    QDir temDir("../MapOnline_Demo/BaiDuMap.html");

    QString absDir = temDir.absolutePath();
    qDebug()<<absDir;

    //JavaScript调用C++
    QWebChannel *channel = new QWebChannel(this);
    channel->registerObject("bridge", (QObject*)bridge::instance());
    view->page()->setWebChannel(channel);
    //C++调用JavaScript
    view->page()->load(QUrl(QString("file:///%1").arg(absDir)));

    /*****************************************************************************************/
}

MapOnlineDemo::~MapOnlineDemo()
{
    delete ui;
}

void MapOnlineDemo::on_btn_point_clicked()
{//描点demo
    QString lon_goo =   ui->lEdt_lon_1->text();
    QString lat_goo =   ui->lEdt_lat_1->text();

    double *result  =   ToBaiduPos(lon_goo,lat_goo);
    //状态信息判断
    if(result[2]!=0.0)
    {
        //各种错误信息参考：http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
        QString info    =   QString("转换失败,状态代码：%1").arg(result[2]);
        qDebug()<<info;

        lon_lx= lon_lx  ;
        lat_lx= lat_lx  ;
    }
    else {
        QString info    =   QString("转换成功，转换结果:经度 %1,纬度 %2")
                .arg(QString::number(result[0],'f',10))
                .arg(QString::number(result[1],'f',10));
        qDebug()<<info;

        lon_lx =   result[0];
        lat_lx =   result[1];

        //JavaScript命令
        QString cmd = QString("showAddressAdjust_blue(%1,%2)").arg(QString::number(lon_lx,'f',10)).arg(QString::number(lat_lx,'f',10));
        view->page()->runJavaScript(cmd);
    }
}
void MapOnlineDemo::on_btn_line_clicked()
{//画线demo
    QString lon_goo =   ui->lEdt_lon_2->text();
    QString lat_goo =   ui->lEdt_lat_2->text();

    double *result  =   ToBaiduPos(lon_goo,lat_goo);
    //状态信息判断
    if(result[2]!=0.0)
    {
        //各种错误信息参考：http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
        QString info    =   QString("转换失败,状态代码：%1").arg(result[2]);
        qDebug()<<info;

        lon_lx_pre  = lon_lx_pre  ;
        lat_lx_pre  = lat_lx_pre  ;
    }
    else {
        QString info    =   QString("转换成功，转换结果:经度 %1,纬度 %2")
                .arg(QString::number(result[0],'f',10))
                .arg(QString::number(result[1],'f',10));
        qDebug()<<info;

        lon_lx_pre  =   lon_lx  ;
        lat_lx_pre  =   lat_lx  ;

        lon_lx =   result[0];
        lat_lx =   result[1];

        //JavaScript命令
        QString cmd2 = QString("drawPlaneTrack(%1,%2,%3,%4)")
                .arg(QString::number(lon_lx_pre,'f',10))
                .arg(QString::number(lat_lx_pre,'f',10))
                .arg(QString::number(lon_lx,'f',10))
                .arg(QString::number(lat_lx,'f',10));//画线
        view->page()->runJavaScript(cmd2);
    }
}

double * MapOnlineDemo::ToBaiduPos(QString lon,QString lat)
{
/******************************************************************************************************************
 * 函数名称：double * ToBaiduPos(QString lon,QString lat)
 * 函数功能：通过访问百度地图API接口，实现GPS坐标/WGS84坐标经纬度坐标转换为百度坐标系下的坐标
 * 包含自定义函数：QString getHtml(QString url)
 * 函数输入：QString的经度(lon)和纬度(lat)
 * 函数输出：double *result
 *         result指向一个包含3个元素的double数组，各元素含义如下：
 *         result[0]: 转换完成后的经度
 *         result[2]: 转换完成后的纬度
 *         result[3]: 百度地图API的URL返回的状态变量status值
 * 使用示例：
    double *result  =   ToBaiduPos(lon_goo,lat_goo);
    //状态信息判断
    if(result[2]!=0.0)
    {
        //各种错误信息参考：http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
        QString info    =   QString("转换失败,状态代码：%1").arg(result[2]);
        qDebug()<<info;
    }
    else {
        QString info    =   QString("转换成功，转换结果:经度 %1,纬度 %2")
                .arg(QString::number(result[0],'f',10))
                .arg(QString::number(result[1],'f',10));
        qDebug()<<info;
    }
 * ****************************************************************************************************************/
    //函数功能：实现其他坐标系转换为百度坐标系坐标(经纬度)
    double lat_bd,lon_bd,status; //存储于转换之后的百度坐标系下的坐标以及转换状态变量
    QString str_msg,str_msg_tmp; //API接口返回值字符串分割状态变量

    QString str = QString("http://api.map.baidu.com/geoconv/v1/?coords=%1,%2&from=1&to=5&ak=pv1tQCTFXzWnHUGfTDLb2GpSwltgDcnK")
            .arg(lon).arg(lat); //百度地图坐标转换API接口URL，返回值包含转换之后的坐标
    //百度地图API URL各参数含义参考链接：http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
    qDebug()<<str;

    QString data = getHtml(str); //获取转换结果
    //正常转换结果data示例如下：
    //{"status":0,"result":[{"x":40.0658472,"y":117.002866}]}
    //异常转换结果data示例如下：
    //{"status":24,"message":"param error:coords format error"}
    qDebug() << data;


    str_msg =   data.section(':',1,1).section(',',0,0); //分割字符串，获取状态信息status值
    status  =   str_msg.toDouble();
    if(status == 0.0)
    {//状态为0表示转换成功
        str_msg_tmp =   data.section(':',3,3).section(',',0,0);
        lon_bd  =   str_msg_tmp.toDouble();
        str_msg_tmp =   data.section(':',4,4).section('}',0,0);
        lat_bd  =   str_msg_tmp.toDouble();
    }
    else
    {//状态为其他表示转换出现异常
        str_msg_tmp =   data.section(':',3,3).section('\"',0,0);

        //异常经纬度返回为0
        lon_bd  =   0.0;
        lat_bd  =   0.0;
    }

    //返回结果定义
    double *result  =   new double[3]{lon_bd,lat_bd,status};
    return result;
}


QString MapOnlineDemo::getHtml(QString url)
{
/******************************************************************************************************************
 * 函数名称：QString getHtml(QString url)
 * 函数功能：访问指定URL，返回URL的返回值
 * 参考链接：https://blog.csdn.net/qq_25188995/article/details/81322762
 * 工程包含：QT += network
 * 头文件包含：
 *          #include <QNetworkAccessManager>
 *          #include <QNetworkRequest>
 *          #include <QNetworkReply>
 * 使用示例：
 * QString str = QString("http://api.map.baidu.com/geoconv/v1/?coords=你的经度,你的纬度&from=1&to=5&ak=你的秘钥");
 * QString data = getHtml(str); //获取转换结果
 * ****************************************************************************************************************/
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
    QByteArray responseData;
    QEventLoop eventLoop;
    connect(manager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
    eventLoop.exec();       //block until finish
    responseData = reply->readAll();
    return QString(responseData);
}

